<?php
/**
 * coreSessionFiles
 *
 * 파일시스템을 이용하여 세션데이터를 저장하고 관리합니다.
 *
 * @package core
 * @author  Platform Team
 */

class coreSessionFiles extends coreSessionAbstract
{
    /**
     * 세션 파일 접두어
     */
    const PREFIX_SESS = 'sess_';

    /**
     * 세션 파일 생성 풀경로
     */
    private $sSavePath;

    /**
     * 세션 파일 저장 디렉토리
     */
    private $sSaveDir;

    /**
     * open Handler
     */
    public function open($sSavePath, $sSessName)
    {
        $this->sSaveDir  = $sSavePath;
    }

    /**
     * close Handler
     */
    public function close()
    {
        //Empty
    }

    /**
     * read Handler
     */
    public function read($sSessId)
    {
        $this->sSavePath = $this->getSavePath();

        $sData = '';

        if (is_file($this->sSavePath)) {
            $sData = file_get_contents($this->sSavePath);
        }

        $sData = $this->loadData($sData);

        return $sData;
    }

    /**
     * write Handler
     */
    public function write($sSessId, $sData)
    {
        if ($this->getPreventSave()) {
            return;
        }

        $sData = $this->saveData($sData);

        return file_put_contents($this->sSavePath, $sData);
    }

    /**
     * destroy Handler
     */
    public function destroy($sSessId)
    {
        return @unlink($this->sSavePath);
    }

    /**
     * garbage collector Handler
     */
    public function gc($iMaxLife)
    {
        foreach (glob($this->sSaveDir . '/' .self::PREFIX_SESS.'*') as $sPath) {
            $iTarget = (int)(filemtime($sPath) + $iMaxLife);
            $iCurr   = time();

            if ($iTarget < $iCurr) {
                @unlink($sPath);
            }
        }
    }

    /**
     * 세션파일 전체 경로
     *
     * @return string
     */
    private function getSavePath()
    {
        return $this->sSaveDir . DS . self::PREFIX_SESS . $this->sessionId();
    }
}
